package org.yxt.message.netty;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.CharsetUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.Map;

/**
 * 处理数据
 *
 * @author yxt
 * <p>
 * Sep 20, 2017
 */
public class NettyServerSimpleHandler extends SimpleChannelInboundHandler<Object> {

    private static Logger logger = LoggerFactory.getLogger(NettyServerSimpleHandler.class);

    // 服务器向客户端响应心跳3
    private final String PONG = "pong";

    // 读取参数 解码器和编码器是String 不要去转格式 nettyData 的 4-msgCode 用户绑定用户id和通道 5-主动要求绑定数据 6-数据消息
    @Override
    public void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {
        String content = (String) msg;

    }

    // 数据读取完成之后释放资源 不使用
    // @Override
    // public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
    // ctx.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);
    // }

    // 服务器-客户端建立连接之后
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        logger.info("有连接接入 id {} ip {}", ctx.channel().id(), ctx.channel().remoteAddress());
        // 主动要求绑定数据 5
        String content = "hello";
        ByteBuf buffer = Unpooled.buffer(content.length());
        buffer.writeBytes(content.getBytes(CharsetUtil.UTF_8));
        ctx.writeAndFlush(buffer);
    }

    // 服务器-客户端连接中断 服务器端断开之后清除客户端连接
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        logger.info("连接断开 << {}", ctx.channel().remoteAddress());
        removeMapData(ctx);
        ctx.close();
    }

    // 异常捕获
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        logger.error("异常捕获 {}", cause.getMessage());
        removeMapData(ctx);
        ctx.close();
    }

    /**
     * 移除数据
     *
     * @param ctx
     */
    private void removeMapData(ChannelHandlerContext ctx) {
        if (null != NettyServer.socketChanelKeyMap) {
            int userId = 0;
            for (Map.Entry<Integer, ChannelHandlerContext> entry : NettyServer.socketChanelKeyMap.entrySet()) {
                if (ctx.equals(entry.getValue())) {
                    userId = entry.getKey();
                    break;
                }
            }
            if (0 < userId) {
                NettyServer.socketChanelKeyMap.remove(userId);
            }
        }

        // 移除用户
        // NettyServer.socketChanelKeyMap.remove(ctx.channel().id().toString());
        // // 查询用户user的map
        // int userIdTemp = 0;
        // for (Map.Entry<Integer, String> entry : userIdMap.entrySet()) {
        // if (null != entry) {
        // if (ctx.channel().id().toString().equals(entry.getValue())) {
        // userIdTemp = entry.getKey();
        // }
        // }
        // }
        // if (0 < userIdTemp) {
        // userIdMap.remove(userIdTemp);
        // }

    }

}
